AWS Step FunctionsステートマシンでStates.Formatによる文字列テンプレートを使用する(AWS CDK)
こんにちは、CX事業本部 IoT事業部の若槻です。
以前の下記エントリでは、States.Format
による文字列テンプレートを使用するステートマシンを、Workflow Studioを使用して作ってみました。
今回は、AWS Step FunctionsステートマシンでStates.Format
による文字列テンプレートを使用する構成を、AWS CDKで作ってみました。
States.Formatとは
Step FunctionsではIntrinsic functionsという組み込み関数を使用できます。
そのうち文字列リテラル中の特定シーケンス({}
)の置き換えをするテンプレートのような利用ができるものがStates.Formatです。
例えば下記のような入力がある場合に、
{ "name": "Arnav", "template": "Hello, my name is {}." }
States.Format
を下記のように使用すれば、
States.Format($.template, $.name)
Hello, my name is Arnav.
という出力を得られます。
やってみた
CDKコード
Lambda関数の実行インプットでStates.Format()
を使用するタスクを実行するステートマシンを作成しています。
import * as cdk from '@aws-cdk/core'; import * as lambda from '@aws-cdk/aws-lambda'; import * as sfn from '@aws-cdk/aws-stepfunctions'; import * as tasks from '@aws-cdk/aws-stepfunctions-tasks'; export class AwsCdkAppStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const helloFunc = new lambda.Function(this, 'helloFunc', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null); }; `), runtime: lambda.Runtime.NODEJS_14_X, handler: 'index.handler', }); const helloTask = new tasks.CallAwsService(this, 'helloTask', { service: 'lambda', action: 'invoke', parameters: { FunctionName: helloFunc.functionName, Payload: { 'greet.$': "States.Format('{}, {}!', 'Hello', $.name)", }, }, iamResources: [helloFunc.functionArn], iamAction: 'lambda:InvokeFunction', }); new sfn.StateMachine(this, 'helloStateMachine', { definition: helloTask, }); } }
CDKスタックをcdk deploy
でデプロイします。
動作
作成されたステートマシンを実行すると、
{ "name": "Step Functions" }
実行結果で、テンプレート中の{}
が置き換えられて文字列リテラルが作成されています。
//CDk上での記述 { 'greet.$': "States.Format('Hello, {}!', 'Step Functions')" } //実行結果 { "greet": "Hello, Step Functions!" }
おわりに
AWS Step FunctionsステートマシンでStates.Format
による文字列テンプレートを使用する構成を、AWS CDKで作ってみました。
Intrinsic functionsをAWS CDKで使用する場合も、CDKの組み込み関数など使わずにWorkflow Studioから作成する場合と同じような記述とすれば良いようです。
以上